/* ==================================================================   
 * Created [2009-4-27 下午11:32:55] by Jon.King 
 * ==================================================================  
 * TSS 
 * ================================================================== 
 * mailTo:jinpujun@hotmail.com
 * Copyright (c) Jon.King, 2009-2012 
 * ================================================================== 
*/

package com.jinhe.tss.component.dynproperty;

import java.util.List;

import com.jinhe.tss.component.dynproperty.entity.DynableEntity;
import com.jinhe.tss.component.dynproperty.entity.GridTemplate;
import com.jinhe.tss.component.dynproperty.entity.PropertyDef;
import com.jinhe.tss.component.dynproperty.entity.XFormTemplate;
import com.jinhe.tss.component.dynproperty.entity.XFormTemplateTab;
import com.jinhe.tss.component.dynproperty.support.IRemotePropertyService;
import com.jinhe.tss.core.exception.BusinessException;

/** 
 * <p> IPropertyService.java </p>
 * 动态属性service接口，继承 动态属性远程调用service接口。
 * 
 * @author Jon.Jing 2008/04/14 10:18:54 $ 
 */
public interface PropertyService extends IRemotePropertyService{
    /**
     * 导入动态实体以及实体基本属性和模板信息。（远程）
     * @param docXmlStr
     */
    void importDynableEntity(String docXmlStr, Long groupId); 
    
    /**
     * 获取所有的动态实体组、动态实体以及各个实体包含的所有属性、还有实体的模板信息（包括Grid、Xform模板）.
     * 并相应的组装起来。
     * 
     * @param isOnlyGroup
     *                  是否只取动态实体组，移动的时候用到。
     * @return
     */
    List<?> getDynableEntities(boolean isOnlyGroup);
    
    /****************************************************************************************************
     ****************************   实体组实体维护（实体维 护更多在父接口中）   ******************************* 
     *****************************************************************************************************/
    /**
     * 根据id获取动态实体组或实体对象
     * @return
     */
    DynableEntity getGroupOrEntityById(Long id);
    
    /**
     * 保存动态实体组
     * @param group
     * @return
     */
    DynableEntity saveGroup(DynableEntity group);
    
    /**
     * 删除实体组或实体。
     * 如果是实体组则，将该组下拥有的动态实体组和动态实体移动到根目录下；
     * 如果是实体，调用deleteDynableEntity(String entityCode)。
     * @param id
     */
    void deleteGroupOrEntity(Long id);
    
    /**
     * 获取可以移动至的实体组列表
     * @param id
     * @return
     */
    List<?> getCanMoveToGroups(Long id);
    
    /**
     * 移动动态实体
     * @param id
     * @param targetId
     *          目标组ID
     */
    void moveGroupOrEntity(Long id, Long targetId);
 
    /****************************************************************************************************
     *********************************************  属性维护  ********************************************
     *****************************************************************************************************/
    /**
     * 根据id值获取属性对象
     * @param propertyId
     * @return
     */
    PropertyDef getPropertyById(Long propertyId);
    
    /**
     * 保存属性
     * @param property
     * @return
     */
    PropertyDef saveProperty(PropertyDef property);
    
    /**
     * 删除动态属性以及动态属性值
     * @param id
     */
    void deleteProperty(Long id);
    
    /**
     * 在当前动态实体下复制一个属性
     * @param id
     * @return
     */
    PropertyDef copyProperty(Long id);
    
    /**
     * 复制属性到指定的动态实体。
     * 如果
     * @param id
     *          属性id
     * @param targetId
     *          目标实体id
     * @return
     */
    PropertyDef copyPropertyTo(Long id, Long targetId);
    
    /**
     * 属性排序
     * @param propertyId
     * @param targetId
     * @param direction
     */
    void sortProperty(Long propertyId, Long targetId, int direction);
 
    /****************************************************************************************************
     *********************************************  模板维护  ********************************************
     *****************************************************************************************************/
    
    /**
     * 保存XForm模板布局.
     * 保存XForm模板declare节点和layout节点信息，并记录实体属性值保存到了哪个tab中.
     * @param tab
     */
    void saveXForm(String layoutStr);
    /**
     * 新增或修改一个XForm模板
     * @param xTemplate
     */
    XFormTemplate saveXFormTemplate(XFormTemplate xTemplate);
    
    /**
     * 新增或修改一个XForm模板Tab页.
     * 保存XForm模板declare节点和layout节点信息，并记录实体属性值保存到了哪个tab中.
     * @param tab
     */
    XFormTemplateTab saveXFormTemplateTab(XFormTemplateTab tab, String entityCode);
    
    XFormTemplateTab saveXFormTemplateTab(XFormTemplateTab tab);
    
    /**
     * 删除一个XForm模板包括其下所有的Tab页
     * @param xTemplate
     */
    void deleteXFormTemplate(Long xTemplateId);
    
    /**
     * 删除一个XForm模板Tab页,同时删除该tab页在PropertyTab表中和属性的对应关系
     * @param tab
     */
    void deleteXFormTemplateTab(Long tabId);
     
    /**
     * 获取某个动态对象实体所有的属性、某组XForm模板及其所有tab页信息。
     * @param entityCode
     * @param templateCode
     *               模板code
     * @return
     */
    Object[] getXFormTempalteInfo(String entityCode, String xCode);

    
    /**
     * 新增或修改一个Grid模板
     * @param gTemplate
     */
    GridTemplate saveGridTemplate(GridTemplate gTemplate);
 
    /**
     * 删除一个Grid模板包括其下所有的Tab页
     * @param gTemplate
     */
    void deleteGridTemplate(Long gTemplateId);   
  
    /**
     * 获取某个指定的Grid模板,维护的时候用.
     * 区别远程接口中的getGridTemplate(String entityCode, String gCode)。
     * 
     * @param entityCode
     * @param templateCode
     *               模板code
     * @return
     */
    String getGridTemplateInfo(String entityCode, String gCode);
    
    /**
     * 根据code值获取对应的动态实体对象
     * @param entityCode
     * @return
     */
    DynableEntity getDynableEntity(String entityCode) throws BusinessException;
    
    /**
     * 根据动态实体的code值和XForm模板的code值获取对象XForm模板
     * @param entityCode
     * @param xCode
     * @return
     */
    XFormTemplate getXFormTemplateByCode(String entityCode, String xCode) throws BusinessException;
    
    /**
     *  根据动态实体的code值和Grid模板的code值获取对象Grid模板
     * @param entityCode
     * @param gCode
     * @return
     * @throws BusinessException
     */
    GridTemplate getGridTemplateByCode(String entityCode, String gCode) throws BusinessException;
    
    /**
     * 获取一个对象，提供本方法主要是方便action中获取对象。
     * @param clazz
     * @param id
     * @return
     */
    Object getEntity(Class<?> clazz, Long id);
}

